#ifndef SOCKETCANFD_HPP
#define SOCKETCANFD_HPP

#include <chrono>
#include <memory>
#include <string>


#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h>

namespace gaoqing_motor_hardware_interface
{
class gaoqing_motor_socketcanfd
{
private:
    int socket_fd_;
    struct sockaddr_can addr_;
    struct ifreq ifr_;

    u_int16_t gaoqing_motor_id_{0x01U}; // 电机id
    double reduction_ratio_{36.0}; // 电机减速比

    struct motor_state
    {
        float position = 0; // 转
        float velocity = 0; // 转/s
        float torque = 0; // Nm
    };

    struct motor_state motor_state_[1];
    
public:
    gaoqing_motor_socketcanfd();
    ~gaoqing_motor_socketcanfd();

    // 初始化socketcan通信
    bool init(const char* ifname);
    // 电机停止(关闭对应id的电机)
    bool gaoqing_motor_shutdown(uint16_t id);
    // 电机力矩控制(一拖多)
    void gaoqing_motor_torque_control(int16_t torque1);
    // 读取电机状态(读取对应id的电机状态 模式二 float类型)
    void gaoqing_motor_state_read(uint16_t id);

};

}



#endif

#endif